package com.weizhi.file.controller.admin;

import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.AppendObjectRequest;
import com.aliyun.oss.model.AppendObjectResult;
import com.aliyun.oss.model.ObjectMetadata;
import com.github.pagehelper.PageInfo;
import com.weizhi.server.dto.FileDto;
import com.weizhi.server.dto.ResponseDto;
import com.weizhi.server.entity.Chapter;
import com.weizhi.server.service.FileService;
import com.weizhi.server.util.Base64ToMultipartFile;
import com.weizhi.server.util.JsonUtil;
import com.weizhi.server.util.PropertyCopyUtil;
import lombok.Cleanup;
import lombok.SneakyThrows;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;


import javax.servlet.http.HttpServletRequest;
import java.io.*;

@RestController
@RequestMapping("/admin/oss")
public class OssController {

    @Autowired
    private FileService fileService;

    @Value("${oss.accessKeyId}")
    private String accessKeyId;

    @Value("${oss.accessKeySecret}")
    private String accessKeySecret;

    @Value("${oss.endpoint}")
    private String endpoint;

    @Value("${oss.bucket}")
    private String bucket;

    @Value("${oss.domain}")
    private String ossDomain;
    
    private final static Logger logger = LoggerFactory.getLogger(OssController.class);

    @SneakyThrows
    @RequestMapping("/upload/{dir1}/{dir2}")
    public ResponseDto upload(@RequestBody FileDto fileDto, @PathVariable("dir1") String dir1,
                            @PathVariable("dir2") String dir2){

        logger.info("ossController-upload, fileName={}, shareKey={}, shareIndex={}", fileDto.getName(), fileDto.getShareKey(), fileDto.getShareIndex());

        String originalFilename = fileDto.getName();
        Integer shareIndex = fileDto.getShareIndex();
        long shareSize = 5 * 1024 * 1024; //5MB
        String fileBase64 = fileDto.getFile();
        MultipartFile file = Base64ToMultipartFile.base64ToMultipart(fileBase64);

        //获取文件存放目录
        String fileSaveDir = dir1 + "/" + dir2 + "/";
        String fileSaveName = fileDto.getShareKey() + "." + fileDto.getSuffix();
        String filePath = fileSaveDir + fileSaveName;

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ObjectMetadata meta = new ObjectMetadata();
// 指定上传的内容类型。
        meta.setContentType("text/plain");

// 通过AppendObjectRequest设置多个参数。
        AppendObjectRequest appendObjectRequest = new AppendObjectRequest(bucket, filePath, new ByteArrayInputStream(file.getBytes()), meta);

// 通过AppendObjectRequest设置单个参数。
// 设置存储空间名称。
//appendObjectRequest.setBucketName("<yourBucketName>");
// 设置文件名称。
//appendObjectRequest.setKey("<yourObjectName>");
// 设置待追加的内容。有两种可选类型：InputStream类型和File类型。这里为InputStream类型。
//appendObjectRequest.setInputStream(new ByteArrayInputStream(content1.getBytes()));
// 设置待追加的内容。有两种可选类型：InputStream类型和File类型。这里为File类型。
//appendObjectRequest.setFile(new File("<yourLocalFile>"));
// 指定文件的元信息，第一次追加时有效。
//appendObjectRequest.setMetadata(meta);

// 第一次追加。
// 设置文件的追加位置。
//        appendObjectRequest.setPosition(0L);
        appendObjectRequest.setPosition((long) ((shareIndex - 1) * shareSize));
        AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
        // 文件的64位CRC值。此值根据ECMA-182标准计算得出。
        System.out.println(appendObjectResult.getObjectCRC());

// 第二次追加。
// nextPosition指明下一次请求中应当提供的Position，即文件当前的长度。
//        appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
//        appendObjectRequest.setInputStream(new ByteArrayInputStream(content2.getBytes()));
//        appendObjectResult = ossClient.appendObject(appendObjectRequest);


// 关闭OSSClient。
        ossClient.shutdown();

        //返回文件对象
        fileDto.setPath(dir1 + "/" + dir2 + "/" + fileSaveName);


        //保存文件到数据库
        fileService.save(fileDto);

        fileDto.setPath(ossDomain + fileDto.getPath());
        return ResponseDto.createBySuccess(fileDto);
    }



}
